﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using GamePlugin.Logics.Core;
using System.Xml;

namespace GamePlugin.Logics.Data
{
    public class PropertyItemList : DependencyObject
    {
        public PropertyItemList()
        {
            Add("職業", "巫醫");
            Add("職業", "武僧");
            Add("職業", "狩魔獵人");
            Add("職業", "秘術師");
            Add("職業", "野蠻人");

            Add("裝備類型", "單手");
            Add("裝備類型", "雙手");
            Add("裝備類型", "副手");
            Add("裝備類型", "防具");
            Add("裝備類型", "追隨者");

            Add("物品稀有度", "全部");
            Add("物品稀有度", "次等");
            Add("物品稀有度", "普通");
            Add("物品稀有度", "高級");
            Add("物品稀有度", "魔法");
            Add("物品稀有度", "稀有");
            Add("物品稀有度", "傳奇");

            Add("單手物品類型", "所有武器類型");
            Add("單手物品類型", "斧");
            Add("單手物品類型", "祭祀刀");
            Add("單手物品類型", "弩搶");
            Add("單手物品類型", "匕首");
            Add("單手物品類型", "拳套武器");
            Add("單手物品類型", "釘錘");
            Add("單手物品類型", "重型武器");
            Add("單手物品類型", "矛");
            Add("單手物品類型", "劍");
            Add("單手物品類型", "魔杖");

            Add("雙手物品類型", "所有武器類型");
            Add("雙手物品類型", "雙手斧");
            Add("雙手物品類型", "弓");
            Add("雙手物品類型", "武杖");
            Add("雙手物品類型", "弩");
            Add("雙手物品類型", "雙手釘錘");
            Add("雙手物品類型", "雙手重型武器");
            Add("雙手物品類型", "長柄武器");
            Add("雙手物品類型", "法杖");
            Add("雙手物品類型", "雙手劍");

            Add("副手物品類型", "全部物品");
            Add("副手物品類型", "咒物");
            Add("副手物品類型", "法器");
            Add("副手物品類型", "箭筒");
            Add("副手物品類型", "盾");

            Add("防具物品類型", "全部防禦類型");
            Add("防具物品類型", "護身符");
            Add("防具物品類型", "腰帶");
            Add("防具物品類型", "靴子");
            Add("防具物品類型", "護腕");
            Add("防具物品類型", "胸甲");
            Add("防具物品類型", "斗篷");
            Add("防具物品類型", "手套");
            Add("防具物品類型", "頭盔");
            Add("防具物品類型", "褲子");
            Add("防具物品類型", "重型腰帶");
            Add("防具物品類型", "戒指");
            Add("防具物品類型", "護肩");
            Add("防具物品類型", "煉氣石");
            Add("防具物品類型", "巫毒面具");
            Add("防具物品類型", "秘術帽");

            Add("追隨者物品類型", "無");

            PropertyTreeRoot = BuildAll();

            DetailedPropertyTreeRoot = new DetailedPropertyTreeItem(null, "");
            AddDetailedProperty("無", "");

            AddDetailedProperty("人物屬性", "：力量");
            AddDetailedProperty("人物屬性", "：敏捷");
            AddDetailedProperty("人物屬性", "：智力");
            AddDetailedProperty("人物屬性", "：體能");
            AddDetailedProperty("傷害", "：對精英怪傷害提高");
            AddDetailedProperty("傷害", "：平均傷害");
            AddDetailedProperty("傷害", "：平均冰寒傷害");
            AddDetailedProperty("傷害", "：平均毒素傷害");
            AddDetailedProperty("傷害", "：平均火焰傷害");
            AddDetailedProperty("傷害", "：平均神聖傷害");
            AddDetailedProperty("傷害", "：平均秘法傷害");
            AddDetailedProperty("傷害", "：平均電擊傷害");
            AddDetailedProperty("傷害", "：攻擊速度%");
            AddDetailedProperty("傷害", "：武器傷害%");
            AddDetailedProperty("傷害", "：流血最小傷害%");
            AddDetailedProperty("傷害", "：流血機率");
            AddDetailedProperty("傷害", "：暴擊傷害");
            AddDetailedProperty("傷害", "：暴擊機率");
            AddDetailedProperty("傷害", "元素加成：火焰");
            AddDetailedProperty("傷害", "元素加成：秘法");
            AddDetailedProperty("傷害", "元素加成：電擊");
            AddDetailedProperty("其他", "不壞");
            AddDetailedProperty("其他", "鑲孔");
            AddDetailedProperty("其他", "降低等級要求");
            AddDetailedProperty("冒險", "拾取距離");
            AddDetailedProperty("冒險", "擊殺經驗加成");
            AddDetailedProperty("冒險", "移動速度");
            AddDetailedProperty("冒險", "金幣尋獲量");
            AddDetailedProperty("冒險", "魔寶尋獲率");
            AddDetailedProperty("巫醫", "技能加成：亡靈之壁");
            AddDetailedProperty("巫醫", "技能加成：召喚殭屍犬");
            AddDetailedProperty("巫醫", "技能加成：召喚蟲群");
            AddDetailedProperty("巫醫", "技能加成：強酸毒霧");
            AddDetailedProperty("巫醫", "技能加成：火蝙蝠");
            AddDetailedProperty("巫醫", "技能加成：屍蛛");
            AddDetailedProperty("巫醫", "技能加成：毒液吹箭");
            AddDetailedProperty("巫醫", "技能加成：火焰炸彈");
            AddDetailedProperty("巫醫", "技能加成：疫病蟾蜍");
            AddDetailedProperty("巫醫", "技能加成：突屍衝撞");
            AddDetailedProperty("巫醫", "技能加成：噬魂");
            AddDetailedProperty("巫醫", "技能加成：魂靈彈幕");
            AddDetailedProperty("巫醫", "法力上限");
            AddDetailedProperty("巫醫", "法力恢復率");
            AddDetailedProperty("抗性", "全元素");
            AddDetailedProperty("抗性", "冰寒");
            AddDetailedProperty("抗性", "毒素");
            AddDetailedProperty("抗性", "火焰");
            AddDetailedProperty("抗性", "物理");
            AddDetailedProperty("抗性", "秘法");
            AddDetailedProperty("抗性", "電擊");
            AddDetailedProperty("擊中", "有機會造成冰冷");
            AddDetailedProperty("擊中", "有機會造成冰凍");
            AddDetailedProperty("擊中", "有機會造成定身");
            AddDetailedProperty("擊中", "有機會造成恐懼");
            AddDetailedProperty("擊中", "有機會造成擊退");
            AddDetailedProperty("擊中", "有機會造成昏迷");
            AddDetailedProperty("擊中", "有機會造成目盲");
            AddDetailedProperty("擊中", "有機會造成緩速");
            AddDetailedProperty("武僧", "技能加成：伏魔破");
            AddDetailedProperty("武僧", "技能加成：勁風煞");
            AddDetailedProperty("武僧", "技能加成：奔雷拳");
            AddDetailedProperty("武僧", "技能加成：斷空波");
            AddDetailedProperty("武僧", "技能加成：爆裂掌");
            AddDetailedProperty("武僧", "技能加成：百烈拳");
            AddDetailedProperty("武僧", "技能加成：颶風轉");
            AddDetailedProperty("武僧", "技能加成：暴風突襲");
            AddDetailedProperty("武僧", "技能加成：金鐘罩");
            AddDetailedProperty("武僧", "技能加成：雲龍擺尾");
            AddDetailedProperty("武僧", "精氣凝聚");
            AddDetailedProperty("狩魔獵人", "憎恨恢復率");
            AddDetailedProperty("狩魔獵人", "戒律上限");
            AddDetailedProperty("狩魔獵人", "技能加成：刺穿");
            AddDetailedProperty("狩魔獵人", "技能加成：突刺陷阱");
            AddDetailedProperty("狩魔獵人", "技能加成：戰輪");
            AddDetailedProperty("狩魔獵人", "技能加成：掃射");
            AddDetailedProperty("狩魔獵人", "技能加成：榴彈");
            AddDetailedProperty("狩魔獵人", "技能加成：迴避射擊");
            AddDetailedProperty("狩魔獵人", "技能加成：元素箭");
            AddDetailedProperty("狩魔獵人", "技能加成：多重射擊");
            AddDetailedProperty("狩魔獵人", "技能加成：縛影彈");
            AddDetailedProperty("狩魔獵人", "技能加成：縛練彈");
            AddDetailedProperty("狩魔獵人", "技能加成：追噬箭");
            AddDetailedProperty("狩魔獵人", "技能加成：連射");
            AddDetailedProperty("狩魔獵人", "技能加成：集束箭");
            AddDetailedProperty("生命", "之球恢復量");
            AddDetailedProperty("生命", "值加成%");
            AddDetailedProperty("生命", "恢復：擊中");
            AddDetailedProperty("生命", "恢復：擊殺");
            AddDetailedProperty("生命", "恢復：每秒");
            AddDetailedProperty("生命", "恢復：消耗精氣");
            AddDetailedProperty("生命", "竊取");
            AddDetailedProperty("秘術師", "技能加成：冰霜射擊");
            AddDetailedProperty("秘術師", "技能加成：多頭火蛇");
            AddDetailedProperty("秘術師", "技能加成：秘法奔流");
            AddDetailedProperty("秘術師", "技能加成：聚能轟擊");
            AddDetailedProperty("秘術師", "技能加成：裂光波");
            AddDetailedProperty("秘術師", "技能加成：電極");
            AddDetailedProperty("秘術師", "技能加成：幽光刃");
            AddDetailedProperty("秘術師", "技能加成：暴風雪");
            AddDetailedProperty("秘術師", "技能加成：秘法光球");
            AddDetailedProperty("秘術師", "技能加成：隕石術");
            AddDetailedProperty("秘術師", "技能加成：電能脈衝");
            AddDetailedProperty("秘術師", "技能加成：能量旋風");
            AddDetailedProperty("秘術師", "技能加成：魔法飛彈");
            AddDetailedProperty("秘術師", "暴擊秘能恢復");
            AddDetailedProperty("秘術師", "秘能上限");
            AddDetailedProperty("野蠻人", "怒氣上限");
            AddDetailedProperty("野蠻人", "技能加成：復仇");
            AddDetailedProperty("野蠻人", "技能加成：撕裂");
            AddDetailedProperty("野蠻人", "技能加成：擲刃斬");
            AddDetailedProperty("野蠻人", "技能加成：狂亂");
            AddDetailedProperty("野蠻人", "技能加成：猛擊");
            AddDetailedProperty("野蠻人", "技能加成：順劈斬");
            AddDetailedProperty("野蠻人", "技能加成：先祖之鎚");
            AddDetailedProperty("野蠻人", "技能加成：旋風斬");
            AddDetailedProperty("野蠻人", "技能加成：閉地猛擊");
            AddDetailedProperty("野蠻人", "技能加成：霸氣無雙");
            AddDetailedProperty("防禦", "控場效果減免");
            AddDetailedProperty("防禦", "格擋機率");
            AddDetailedProperty("防禦", "精英怪傷害減免");
            AddDetailedProperty("防禦", "荊棘傷害");
            AddDetailedProperty("防禦", "護甲值");
            AddDetailedProperty("防禦", "近戰傷害減免");
            AddDetailedProperty("防禦", "遠程傷害減免");
        }

        private void AddDetailedProperty(string kind, string name)
        {
            DetailedPropertyTreeItem kindItem = null;
            for (int i = 0; i < this.DetailedPropertyTreeRoot.Children.Count; i++)
                if (DetailedPropertyTreeRoot.Children[i].Name == kind)
                {
                    kindItem = DetailedPropertyTreeRoot.Children[i];
                    break;
                }

            if (kindItem == null)
            {
                kindItem = new DetailedPropertyTreeItem(DetailedPropertyTreeRoot, kind);
            }
            if (name != null && name.Length > 0)
                new DetailedPropertyTreeItem(kindItem, name);
        }

        public PropertyTreeItem PropertyTreeRoot
        {
            get;
            set;
        }

        public DetailedPropertyTreeItem DetailedPropertyTreeRoot
        {
            get;
            set;
        }

        public PropertyTreeItem BuildAll()
        {
            PropertyTreeItem root = new PropertyTreeItem(null, "");
            foreach (var equip in this.GetList("裝備類型"))
            {
                PropertyTreeItem p = new PropertyTreeItem(root, equip);
                foreach (var item in this.GetList(equip + "物品類型"))
                {
                    PropertyTreeItem q = new PropertyTreeItem(p, item);
                    AddNewItem(q.FullName);
                    //_PropertyDictionary.Add(q.FullName, new PropertyItem(q.FullName));
                }
            }

            // Special Item
            PropertyTreeItem spe = new PropertyTreeItem(root, "傳奇物品");
            foreach (var equip in this.GetList("裝備類型"))
            {
                PropertyTreeItem p = new PropertyTreeItem(spe, equip);
                AddNewItem(p.FullName);
                //_PropertyDictionary.Add(p.FullName, new PropertyItem(p.FullName));
            }

            return root;
        }

        public void AddNewItem(string name)
        {
            if (_PropertyDictionary.ContainsKey(name) == false)
            {

                string itemName = Helper.GetLengendItemName(name);
                if (itemName != null && itemName.Length > 0)
                    PropertyTreeRoot.RemoveLeaf(itemName);

                _PropertyDictionary.Add(name, new PropertyItem(name));
                _PropertyDictionary[name].Children.Add("0=無");

                if (PropertyTreeRoot != null)
                    PropertyTreeRoot.BuildLeaf(name);
            }
        }

        private void Add(string kind, string name)
        {
            if (_PropertyDictionary.ContainsKey(kind) == false)
            {
                _PropertyDictionary.Add(kind, new PropertyItem(kind));
            }
            _PropertyDictionary[kind].Children.Add(name);
        }

        private List<string> GetList(string kind)
        {
            return _PropertyDictionary[kind].Children.ToList<string>();
        }

        private Dictionary<string, PropertyItem> _PropertyDictionary = new Dictionary<string, PropertyItem>();
        public PropertyItem GetPropertyItem(string name)
        {
            if (_PropertyDictionary.ContainsKey(name) == true)
                return _PropertyDictionary[name];
            else
            {
                if (name.StartsWith("傳奇物品"))
                {
                    if (Workspace.Instance.LengendItemList.Contain(name))
                    {
                        this.AddNewItem(name);
                        return _PropertyDictionary[name];
                    }
                    else
                    {
                        MessageBox.Show("請先在傳奇物品欄中添加名稱");
                    }
                }
                else
                    MessageBox.Show("Error, GetPropertyItem does not has key " + name);
            }

            return null;
        }

        public void ReadXml(XmlNode root)
        {
            _PropertyDictionary.Clear();

            root = root.SelectSingleNode("./" + "Root");

            var countNode = root.SelectSingleNode("./" + "Count");
            int count = int.Parse(countNode.InnerText);

            for (int i = 0; i < count; i++)
            {
                var keyNode = root.SelectSingleNode("./" + "Key" + i.ToString());

                PropertyItem item = new PropertyItem(keyNode.InnerText);

                var valueNode = root.SelectSingleNode("./" + "Value" + i.ToString());
                item.ReadXml(valueNode);

                _PropertyDictionary.Add(keyNode.InnerText, item);

            }
        }

        public void WriteXml(XmlWriter writer)
        {
            writer.WriteStartElement("Root");

            writer.WriteStartElement("Count");
            writer.WriteString(_PropertyDictionary.Count.ToString());
            writer.WriteFullEndElement();

            int index = 0;
            foreach (var key in _PropertyDictionary.Keys)
            {
                writer.WriteStartElement("Key" + index.ToString());
                writer.WriteString(key);
                writer.WriteFullEndElement();

                writer.WriteStartElement("Value" + index.ToString());
                _PropertyDictionary[key].WriteXml(writer);
                writer.WriteFullEndElement();

                index++;
            }

            writer.WriteFullEndElement();
        }
    }
}
